home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / vbcc / vbc.h < prev    next >
C/C++ Source or Header  |  1997-01-27  |  14KB  |  540 lines

  1. /*  $VER: vbcc (vbc.h) V0.4     */
  2.  
  3. #include <stdlib.h>
  4. #include <limits.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stddef.h>
  8. #include <stdarg.h>
  9. #include <ctype.h>
  10.  
  11. #define CHAR 1
  12. #define SHORT 2
  13. #define INT 3
  14. #define LONG 4
  15. #define FLOAT 5
  16. #define DOUBLE 6
  17. #define VOID 7
  18. #define POINTER 8
  19. #define ARRAY 9
  20. #define STRUCT 10
  21. #define UNION 11
  22. #define ENUM 12
  23. #define FUNKT 13
  24. #define UNSIGNED 16
  25. #define CONST 64
  26. #define VOLATILE 128
  27. #define UNCOMPLETE 256
  28. #define STRINGCONST 512
  29.  
  30. #include "machine.h"
  31.  
  32. #define eval_constn(a) eval_const(&a->val,a->ntyp->flags)
  33.  
  34. /*  Zusaetzliche Informationen ueber Funktionen (z.Z. Rumpf fuer Inlining)  */
  35. struct function_info{
  36.     struct IC *first_ic,*last_ic;
  37.     struct Var *vars;
  38. };
  39.  
  40. struct Typ{
  41.     int flags;
  42.     struct Typ *next;
  43.     struct struct_declaration *exact;
  44.     zlong size;
  45. };
  46. #define TYPS sizeof(struct Typ)
  47.  
  48. struct identifier_list{
  49.     char *identifier;
  50.     int length;
  51.     struct identifier_list *next;
  52. };
  53. struct Var{
  54.     int storage_class,reg,priority,flags;
  55.     char *identifier;
  56.     int nesting,index;
  57.     zlong offset;
  58.     struct Typ *vtyp;
  59.     struct const_list *clist;
  60.     struct Var *next;
  61.     struct function_info *fi;
  62.     struct Var *inline_copy;
  63. };
  64. #define USEDASSOURCE 1
  65. #define USEDASDEST 2
  66. #define DEFINED 4
  67. #define USEDASADR 8
  68. #define GENERATED 16
  69. #define CONVPARAMETER 32
  70. #define TENTATIVE 64
  71. #define USEDBEFORE 128
  72. #define INLINEV 256
  73. #define PRINTFLIKE 512
  74. #define SCANFLIKE 1024
  75. #define NOTTYPESAFE 2048
  76. #define DNOTTYPESAFE 4096
  77. #define REGPARM 8192
  78.  
  79. #define SLSIZE 32   /*  struct_lists in diesen Abstaenden realloc'en    */
  80.  
  81. struct struct_list{
  82.     char *identifier;
  83.     struct Typ *styp;
  84.     int storage_class,reg;
  85. };
  86. struct struct_declaration{
  87.     int count;
  88.     struct struct_declaration *next;
  89.     struct struct_list (*sl)[];
  90. };
  91.  
  92. struct struct_identifier{
  93. /*    int flags;*/
  94.     char *identifier;
  95.     struct struct_declaration *sd;
  96.     struct struct_identifier *next;
  97. };
  98.  
  99. struct obj{
  100.     int flags,reg;
  101.     struct Var *v;
  102.     struct AddressingMode *am;
  103.     union atyps{
  104.         zchar vchar;
  105.         zuchar vuchar;
  106.         zshort vshort;
  107.         zushort vushort;
  108.         zint vint;
  109.         zuint vuint;
  110.         zlong vlong;
  111.         zulong vulong;
  112.         zfloat vfloat;
  113.         zdouble vdouble;
  114.         zpointer vpointer;
  115.     }val;
  116. };
  117.  
  118. struct node{
  119.     int flags,lvalue,sidefx;
  120.     struct Typ *ntyp;
  121.     struct node *left;
  122.     struct node *right;
  123.     struct argument_list *alist;
  124.     char *identifier;
  125.     union atyps val;
  126.     struct obj o;
  127. /*  es muss noch sowas wie struct internal_object * dazu    */
  128. };
  129.  
  130. typedef struct node *np;
  131.  
  132. #define NODES sizeof(struct node)
  133.  
  134. #define KOMMA 1
  135. #define ASSIGN 2
  136. #define ASSIGNADD 3
  137. #define ASSIGNSUB 4
  138. #define ASSIGNMULT 5
  139. #define ASSIGNDIV 6
  140. #define ASSIGNMOD 7
  141. #define ASSIGNAND 8
  142. #define ASSIGNXOR 9
  143. #define ASSIGNOR 10
  144. #define ASSIGNLSHIFT 11
  145. #define ASSIGNRSHIFT 12
  146. #define COND 13
  147. #define LOR 14
  148. #define LAND 15
  149. #define OR 16
  150. #define XOR 17
  151. #define AND 18
  152. #define EQUAL 19
  153. #define INEQUAL 20
  154. #define LESS 21
  155. #define LESSEQ 22
  156. #define GREATER 23
  157. #define GREATEREQ 24
  158. #define LSHIFT 25
  159. #define RSHIFT 26
  160. #define ADD 27
  161. #define SUB 28
  162. #define MULT 29
  163. #define DIV 30
  164. #define MOD 31
  165. #define NEGATION 32
  166. #define KOMPLEMENT 33
  167. #define PREINC 34
  168. #define POSTINC 35
  169. #define PREDEC 36
  170. #define POSTDEC 37
  171. #define MINUS 38
  172. #define CONTENT 39
  173. #define ADDRESS 40
  174. #define CAST 41
  175. #define CALL 42
  176. #define INDEX 43
  177. #define DPSTRUCT 44
  178. #define DSTRUCT 45
  179. #define IDENTIFIER 46
  180. #define CEXPR 47
  181. #define STRING 48
  182. #define MEMBER 49
  183. #define CONVCHAR 50
  184. #define CONVSHORT 51
  185. #define CONVINT 52
  186. #define CONVLONG 53
  187. #define CONVFLOAT 54
  188. #define CONVDOUBLE 55
  189. #define CONVVOID 56
  190. #define CONVPOINTER 57
  191. #define CONVUCHAR 58
  192. #define CONVUSHORT 59
  193. #define CONVUINT 60
  194. #define CONVULONG 61
  195. #define ADDRESSA 62
  196. #define FIRSTELEMENT 63
  197. #define PMULT 64
  198. #define ALLOCREG 65
  199. #define FREEREG 66
  200. #define PCEXPR 67
  201. #define TEST 68
  202. #define LABEL 69
  203. #define BEQ 70
  204. #define BNE 71
  205. #define BLT 72
  206. #define BGE 73
  207. #define BLE 74
  208. #define BGT 75
  209. #define BRA 76
  210. #define COMPARE 77
  211. #define PUSH 78
  212. #define POP 79
  213. #define ADDRESSS 80
  214. #define ADDI2P 81
  215. #define SUBIFP 82
  216. #define SUBPFP 83
  217. #define PUSHREG 84
  218. #define POPREG 85
  219. #define POPARGS 86
  220. #define SAVEREGS 87
  221. #define RESTOREREGS 88
  222. #define ILABEL 89
  223. #define DC 90
  224. #define ALIGN 91
  225. #define COLON 92
  226. #define GETRETURN 93
  227. #define SETRETURN 94
  228. #define MOVEFROMREG 95
  229. #define MOVETOREG 96
  230. #define NOP 97
  231.  
  232. struct argument_list{
  233.     np  arg;
  234.     struct argument_list *next;
  235. };
  236.  
  237. #define AUTO 1
  238. #define REGISTER 2
  239. #define STATIC 3
  240. #define EXTERN  4
  241. #define TYPEDEF 5
  242.  
  243. #define MAXI 100 /* maximale Laenge von Identifiers in Bytes    */
  244. #define MAXINPUT 2000    /* maximale Laenge einer Eingabezeile in Bytes  */
  245. #define MAXN 30 /* maximale Verschachtelung von Bloecken */
  246. #define MAXM 100 /* maximale Anzahl an Bloecken pro Funktion (grob) */
  247.  
  248. #define arith(c) ((c)>=CHAR&&(c)<=DOUBLE)
  249.  
  250. extern char *typname[];
  251. extern zlong sizetab[16];
  252. extern char *storage_class_name[];
  253. extern char *ename[];
  254.  
  255. /* Tabelle fuer alignment requirements, maschinenabhaengig */
  256. extern zlong align[16],maxalign;
  257.  
  258. extern void error(int,...);
  259.  
  260. #define ierror(a) error(158,(a),__LINE__,FILE_)
  261.  
  262. extern void free_fi(struct function_info *);
  263. extern struct Typ *arith_typ(struct Typ*,struct Typ *);
  264. extern void insert_const(np);
  265. extern void insert_const2(union atyps *,int);
  266. extern int int_erw(int);
  267. extern int type_expression(np),compare_pointers(struct Typ *,struct Typ *,int),
  268.     compare_sd(struct struct_declaration *,struct struct_declaration *);
  269. extern np identifier_expression(void),constant_expression(void),string_expression(void),
  270.    postfix_expression(void),unary_expression(void),cast_expression(void),
  271.    multiplicative_expression(void),additive_expression(void),
  272.    shift_expression(void),relational_expression(void),equality_expression(void),
  273.    and_expression(void),exclusive_or_expression(void),
  274.    inclusive_or_expression(void),logical_and_expression(void),
  275.    logical_or_expression(void),conditional_expression(void),
  276.    assignment_expression(void),expression(void),primary_expression(void);
  277. /* puh  */
  278. extern void pre(FILE *,np),pra(FILE *,struct argument_list *);
  279. extern void free_expression(np),free_alist(struct argument_list *);
  280. extern void prd(FILE *,struct Typ *),freetyp(struct Typ *);
  281. extern void cpbez(char *m,int ckw),cpnum(char *m),killsp(void);
  282. extern struct struct_declaration *add_sd(struct struct_declaration *);
  283. extern void add_sl(struct struct_declaration *,struct struct_list (*)[]);
  284. extern void free_sd(struct struct_declaration *);
  285. extern void prl(FILE *,struct struct_declaration *);
  286. extern char *add_identifier(char *,int);
  287. extern struct Typ *declarator(struct Typ *),*direct_declarator(struct Typ *),
  288.            *pointer(struct Typ *),*declaration_specifiers(void),
  289.            *clone_typ(struct Typ *);
  290. extern int declaration(int),type_uncomplete(struct Typ *);
  291. extern struct struct_declaration *find_struct(char *,int);
  292. extern void add_struct_identifier(char *,struct struct_declaration *);
  293. extern void free_si(struct struct_identifier *);
  294. extern char *s,*ident;
  295. extern char string[MAXINPUT+2],number[MAXI],buff[MAXI];
  296. extern struct struct_declaration *first_sd[MAXN],*last_sd[MAXN],*merk_sdf,*merk_sdl;
  297. extern struct struct_identifier *first_si[MAXN],*last_si[MAXN],*merk_sif,*merk_sil;
  298. extern struct identifier_list *first_ilist[MAXN],*last_ilist[MAXN],*merk_ilistf,*merk_ilistl;
  299. extern void free_ilist(struct identifier_list *);
  300. extern int nesting;
  301. extern char *empty;
  302. extern struct Var *first_var[MAXN],*last_var[MAXN],*merk_varf,*merk_varl;
  303. extern struct Var *add_var(char *,struct Typ *,int,struct const_list *);
  304. extern void free_var(struct Var *);
  305. extern void var_declaration(void);
  306. extern int storage_class_specifiers(void);
  307. extern void enter_block(void),leave_block(void);
  308. extern struct Var *find_var(char *,int);
  309. extern zlong szof(struct Typ *);
  310.  
  311. extern void eval_const(union atyps *,int);
  312. extern zchar vchar; extern zuchar vuchar;
  313. extern zshort vshort; extern zushort vushort;
  314. extern zint vint; extern zuint vuint;
  315. extern zlong vlong; extern zulong vulong;
  316. extern zfloat vfloat; extern zdouble vdouble;
  317. extern zpointer vpointer;
  318.  
  319. extern int usz;
  320.  
  321. #ifndef DEBUG
  322. extern int DEBUG;
  323. #endif
  324.  
  325. /*  Liste fuer Variablen, die benutzt/veraendert werden.    */
  326. struct varlist{
  327.     struct Var *v;
  328.     int flags;
  329. };
  330.  
  331. #define VLS sizeof(struct varlist)
  332.  
  333. struct IC{
  334.     struct IC *prev,*next;
  335.     int code,typf,defindex,expindex,copyindex;
  336.     int change_cnt,use_cnt,line;
  337.     struct varlist *change_list,*use_list;
  338.     struct obj q1,q2,z;
  339.     char *file;
  340. };
  341.  
  342. #define ICS sizeof(struct IC)
  343. #define KONST 1     /*  KONST muss immer am kleinsten sein, um beim swappen */
  344.                     /*  fuer available_expressions und Konstanten nach      */
  345.                     /*  rechts nicht in eine Endlosschleife zu kommen       */
  346. #define VAR 2
  347. #define SCRATCH 8
  348. #define STACK 16
  349. #define DREFOBJ 32
  350. #define REG 64
  351. #define VARADR 128
  352. #define DONTREGISTERIZE 256
  353.  
  354. extern struct IC *first_ic,*last_ic;
  355. extern int regs[MAXR+1],regsa[MAXR+1],regused[MAXR+1],regscratch[MAXR+1];
  356. extern zlong regsize[MAXR+1];
  357. extern struct Var *regsv[MAXR+1],*regsbuf[MAXR+1];
  358. extern int regbnesting[MAXR+1];
  359.  
  360. extern void add_IC(struct IC *),free_IC(struct IC *),insert_IC(struct IC *,struct IC *);
  361. extern void gen_IC(np,int,int),convert(np,int),gen_label(int),savescratch(int,struct IC *,int);
  362. struct regargs_list{
  363.     struct regargs_list *next;
  364.     int reg;
  365.     struct Var *v;
  366. };
  367. extern zlong push_args(struct argument_list *,struct struct_declaration *,int,struct regargs_list **);
  368. extern int regok(int,int,int),allocreg(int,int),freturn(struct Typ *);
  369. extern int icok(struct IC *);
  370. extern void free_reg(int);
  371. extern void pric(FILE *,struct IC *),pric2(FILE *,struct IC *);
  372. extern char *regnames[];
  373. extern void probj(FILE *,struct obj *,int);
  374.  
  375. extern void printzl(FILE *,zlong),printzul(FILE *,zulong),printzd(FILE *,zdouble);
  376. extern void printval(FILE *,union atyps *,int,int);
  377.  
  378. extern int label;
  379.  
  380. extern FILE *out,*ic1,*ic2,*ppout;
  381.  
  382. extern void statement(void),labeled_statement(void),if_statement(void);
  383. extern void switch_statement(void),while_statement(void),for_statement(void);
  384. extern void do_statement(void),goto_statement(void),continue_statement(void);
  385. extern void break_statement(void),return_statement(void);
  386. extern void expression_statement(void),compound_statement(void),raus(void);
  387. extern void translation_unit(void);
  388. extern int main(int, char *[]);
  389. extern int nocode,registerpri,looppri,currentpri;
  390.  
  391. extern void *mymalloc(size_t);
  392.  
  393. extern np makepointer(np);
  394.  
  395. extern int must_convert(np,int);
  396.  
  397. extern int switch_typ,switch_count,switch_act;
  398. struct llist{
  399.     char *identifier;
  400.     int label,flags,switch_count;
  401.     struct llist *next;
  402.     union atyps val;
  403. };
  404. #define LABELDEFINED 1
  405. #define LABELUSED 2
  406. #define LABELDEFAULT 4
  407. #define LSIZE sizeof(struct llist)
  408. extern struct llist *first_llist,*last_llist;
  409. extern struct llist *find_label(char *),*add_label(char *);
  410. extern void free_llist(struct llist *);
  411.  
  412. extern int endok,return_label,return_value,break_label;
  413. extern struct Var *return_var;
  414. extern struct Typ *return_typ;
  415. extern zlong local_offset[MAXN];
  416.  
  417. extern void scratch_var(struct obj *,int),get_scratch(struct obj *,int,int);
  418. extern struct obj gen_cond(int,int,int);
  419.  
  420. extern void simple_regs(void);
  421.  
  422. union ppi {char *p;long l;void (*f)(char *);};
  423.  
  424. #define USEDFLAG 1
  425. #define STRINGFLAG 2
  426. #define VALFLAG 4
  427. #define FUNCFLAG 8
  428.  
  429. #define MAXCF 30
  430. extern int c_flags[MAXCF];
  431. extern char *c_flags_name[MAXCF];
  432. extern union ppi c_flags_val[MAXCF];
  433.  
  434. extern int g_flags[MAXGF];
  435. extern char *g_flags_name[MAXGF];
  436. extern union ppi g_flags_val[MAXGF];
  437.  
  438.  
  439. extern FILE *open_out(char *,char *);
  440.  
  441. extern char *inname;
  442.  
  443. extern void gen_code(FILE *,struct IC *,struct Var *,zlong);
  444.  
  445. extern int init_cg(void);
  446. extern void cleanup_cg(FILE *);
  447.  
  448. extern void gen_vars(struct Var *);
  449.  
  450. extern int dangerous_IC(struct IC *);
  451.  
  452. extern zlong max_offset;
  453.  
  454. extern int function_calls;
  455.  
  456. struct const_list{
  457.     union atyps val;
  458.     np tree;
  459.     struct const_list *other,*next;
  460. };
  461. extern struct const_list *first_clist,*last_clist;
  462. #define CLS sizeof(struct const_list)
  463.  
  464. /*  Format der Tabelle fuer Fehlermeldungen */
  465. struct err_out{
  466.     char *text;
  467.     int  flags;
  468. };
  469. /*  Flags fuer err_out.flags    */
  470. #define ERROR       1
  471. #define WARNING     2
  472. #define ANSIV       4
  473. #define INTERNAL    8
  474. #define FATAL      16
  475. #define MESSAGE    32
  476. #define DONTWARN   64
  477. #define PREPROC   128
  478. #define NOLINE    256
  479. #define INFUNC    512
  480. #define INIC     1024
  481.  
  482. extern struct err_out err_out[];
  483. extern int err_num;
  484.  
  485. extern void gen_dc(FILE *,int,struct const_list *);
  486. extern void gen_ds(FILE *,zlong,struct Typ *),gen_var_head(FILE *,struct Var *);
  487. extern void gen_align(FILE *,zlong);
  488. extern void free_clist(struct const_list *);
  489.  
  490. extern void remove_IC(struct IC *);
  491.  
  492. extern zlong t_min[];
  493. extern zulong t_max[];
  494. extern zlong char_bit;
  495.  
  496. extern int afterlabel;
  497.  
  498. extern int goto_used;
  499.  
  500. extern int errors;
  501. extern int ic_count;
  502.  
  503.  
  504. /*  fuer den Praeprozessor  */
  505.  
  506. #define MAXPPINPUT 2000     /*  maximale Laenge einer Eingabezeile  */
  507. #define MAXINCNESTING 50    /*  maximale Verschachtelung von Includes   */
  508.  
  509. extern FILE *in[MAXINCNESTING];    /*  Sourcefiles     */
  510. extern int zn[MAXINCNESTING];      /*  Zeilennummern   */
  511. extern char *filename[MAXINCNESTING];   /*  Filenamen   */
  512. extern int incnesting;             /*  aktuelle Verschachtelungstiefe  */
  513. extern unsigned long linenr;                 /*  Zeilennummer */
  514.  
  515. #define MAXINCPATHS 20      /*  maximale Anzahl der Includepfade    */
  516.  
  517. extern char *incpath[MAXINCPATHS];   /*  Includepfade    */
  518.                                             /*  Rest ist NULL   */
  519.  
  520. extern int incpathc;     /*  Anzahl der Includepfade     */
  521.  
  522. extern int pp_init(void);
  523. extern void pp_free(void);
  524. extern int pp_include(char *filename);
  525. extern int pp_nextline(void);
  526. extern int pp_define(char *text);
  527.  
  528. extern int only_inline;
  529.  
  530. extern int read_new_line;
  531. extern int float_used;
  532. extern char *cur_func,errfname[FILENAME_MAX+1];
  533. extern int line,fline;
  534. extern struct IC *err_ic;
  535.  
  536. extern int multiple_ccs;
  537.  
  538. extern int shortcut(int, int);
  539.  
  540.